package com.huahua.api.service.impl;

import cn.hutool.core.util.StrUtil;
import com.huahua.api.entity.dto.DmxApiContent;
import com.huahua.api.entity.dto.DmxApiMessageV2;
import com.huahua.api.entity.dto.DmxApiRequestV2;
import com.huahua.api.entity.utility.svg.param.SvgGenerateParam;
import com.huahua.api.entity.utility.svg.pojo.SvgTemplate;
import com.huahua.api.entity.utility.svg.vo.SvgTemplateVO;
import com.huahua.api.exception.CommonException;
import com.huahua.api.repository.utility.svg.SvgTemplateRepository;
import com.huahua.api.service.DmxApiService;
import com.huahua.api.service.SvgDrawingService;
import com.huahua.api.util.CheckUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Collections;
import java.util.List;

/**
 * SVG绘图服务实现
 *
 * @author System
 * @date 2025-07-06
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SvgDrawingServiceImpl implements SvgDrawingService {

    private final SvgTemplateRepository svgTemplateRepository;
    private final DmxApiService dmxApiService;

    @Override
    public Mono<List<SvgTemplateVO>> getAllTemplates() {
        return svgTemplateRepository.findByRemoveFlag(0)
                .map(this::convertToVO)
                .collectList()
                .doOnError(e -> log.error("获取SVG模板列表失败", e));
    }

    @Override
    public Flux<String> generateSvg(SvgGenerateParam param) {
        // 参数校验
        CheckUtil.checkStrNotBlank(param.getContent(), new CommonException("生成内容不能为空"));

        // 获取模板或使用自定义提示词
        Mono<String> promptMono;
        if (StrUtil.isNotBlank(param.getPrompt())) {
            // 使用自定义提示词
            promptMono = Mono.just(param.getPrompt());
        } else {
            // 根据类型获取模板
            CheckUtil.checkStrNotBlank(param.getType(), new CommonException("模板类型和自定义提示词不能同时为空"));
            promptMono = svgTemplateRepository.findByNameAndRemoveFlag(param.getType(), 0)
                    .map(template -> {
                        // 使用模板的默认值或用户提供的值
                        String ratio = StrUtil.isNotBlank(param.getRatio()) ? param.getRatio() : template.getDefaultRatio();
                        Integer width = param.getWidth() != null ? param.getWidth() : template.getDefaultWidth();
                        Integer height = param.getHeight() != null ? param.getHeight() : template.getDefaultHeight();

                        // 替换模板中的占位符
                        return template.getPrompt()
                                .replace("{content}", param.getContent())
                                .replace("{ratio}", ratio != null ? ratio : "")
                                .replace("{width}", width != null ? width.toString() : "")
                                .replace("{height}", height != null ? height.toString() : "");
                    })
                    .switchIfEmpty(Mono.error(new CommonException("模板类型不存在：" + param.getType())));
        }

        // 调用AI生成SVG
        return promptMono.flatMapMany(prompt -> {
                    // 如果使用自定义提示词，需要处理尺寸参数
                    if (StrUtil.isNotBlank(param.getPrompt())) {
                        StringBuilder fullPrompt = new StringBuilder(prompt);
                        fullPrompt.append("\n\n请生成SVG格式的图片，内容：").append(param.getContent());

                        if (param.getWidth() != null && param.getHeight() != null) {
                            fullPrompt.append("\n尺寸：").append(param.getWidth()).append("x").append(param.getHeight()).append("px");
                        }
                        if (StrUtil.isNotBlank(param.getRatio())) {
                            fullPrompt.append("\n比例：").append(param.getRatio());
                        }

                        prompt = fullPrompt.toString();
                    }

                    List<DmxApiContent> userContent = Collections.singletonList(
                            DmxApiContent.builder()
                                    .type("text")
                                    .text(prompt)
                                    .build()
                    );

                    DmxApiRequestV2 request = DmxApiRequestV2.builder()
                            .model("DMXAPI-HuoShan-DeepSeek-V3")
                            .stream(true)
                            .temperature(0.7)
                            .user("SVG_DRAWING")
                            .messages(Collections.singletonList(
                                    DmxApiMessageV2.builder()
                                            .role("user")
                                            .content(userContent)
                                            .build()
                            ))
                            .build();

                    return dmxApiService.chatCompletions(request);
                })
                .doOnError(e -> log.error("生成SVG失败", e))
                .doOnComplete(() -> log.debug("SVG生成完成"));
    }

    private SvgTemplateVO convertToVO(SvgTemplate template) {
        SvgTemplateVO vo = new SvgTemplateVO();
        vo.setId(template.getId());
        vo.setName(template.getName());
        vo.setDescription(template.getDescription());
        vo.setDefaultRatio(template.getDefaultRatio());
        vo.setDefaultWidth(template.getDefaultWidth());
        vo.setDefaultHeight(template.getDefaultHeight());
        return vo;
    }
}
